home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / share / nikto / plugins / nikto_outdated.plugin < prev    next >
Text File  |  2006-05-29  |  5KB  |  162 lines

  1. #VERSION,1.14
  2. #LASTMOD,02.13.2006
  3. # (c) 2001-2006 cirt.net, All Rights Reserved
  4. # eval build parameters for web servers
  5.  
  6. # the stripping of letters from version numbers could be done better
  7. # versions are loaded from the "outdated.db" file, which should be in the plugins directory
  8. # we cheat, as apache is the main one that uses spaces for loaded modules... if there are others we'll have to hard code them
  9.  
  10. # This software is distributed under the terms of the GPL, which should have been received
  11. # with a copy of this software in the "LICENSE.txt" file.
  12.  
  13. sub nikto_outdated
  14. {
  15.  my $VFILE="$NIKTO{plugindir}/outdated.db";
  16.  my %VERSIONS=load_versions($VFILE);
  17.  
  18.  # populate @BUILDITEMS with appropriate values
  19.  # if Apache, split on space...
  20.  if ($TARGETS{$CURRENT_HOST_ID}{ports}{$CURRENT_PORT}{banner} =~ /apache/i) 
  21.    {
  22.     push(@BUILDITEMS,(split(/ /,$TARGETS{$CURRENT_HOST_ID}{ports}{$CURRENT_PORT}{banner})));
  23.    }
  24.  elsif ($TARGETS{$CURRENT_HOST_ID}{ports}{$CURRENT_PORT}{banner} =~ /weblogic/i) # strip all the date info from weblogic...
  25.    {
  26.     my @T=split(/ /,$TARGETS{$CURRENT_HOST_ID}{ports}{$CURRENT_PORT}{banner});
  27.     push(@BUILDITEMS,"$T[0]\/$T[1]");
  28.    }
  29.  else
  30.    {
  31.     if ($TARGETS{$CURRENT_HOST_ID}{ports}{$CURRENT_PORT}{banner} !~ /\s/)        # has no spaces
  32.      { $MATCHSTRING=$TARGETS{$CURRENT_HOST_ID}{ports}{$CURRENT_PORT}{banner}; }
  33.     elsif ($TARGETS{$CURRENT_HOST_ID}{ports}{$CURRENT_PORT}{banner} =~ /\//)     # has spaces and / sepr
  34.      { 
  35.       $MATCHSTRING=$TARGETS{$CURRENT_HOST_ID}{ports}{$CURRENT_PORT}{banner};
  36.       $MATCHSTRING=~s/\s+//g; }
  37.     else                                     # must create  sepr
  38.      {
  39.       # use the last non 0-9 . a-z char as a sepr (' ', '-', '_' etc)
  40.       my $sepr=$TARGETS{$CURRENT_HOST_ID}{ports}{$CURRENT_PORT}{banner};
  41.       $sepr =~ s/[a-zA-Z0-9\.\(\)]//gi;
  42.       $sepr=substr($sepr,(length($sepr)-1),1);
  43.       # $sepr=~ s/\s+/ /g;
  44.       # break up ID string on $sepr
  45.       my @T=split(/$sepr/,$TARGETS{$CURRENT_HOST_ID}{ports}{$CURRENT_PORT}{banner});
  46.       # assume last is version...
  47.       for ($i=0;$i<$#T;$i++) { $MATCHSTRING .= "$T[$i] "; }
  48.      }
  49.     $MATCHSTRING =~ s/\s+$//;
  50.     push(@BUILDITEMS,$MATCHSTRING);
  51.     nprint("Server Version String:$MATCHSTRING","d");
  52.    }
  53.  
  54.  my ($v, $V, $BI, $k) = "";
  55.  $MATCHSTRING =~ s/[\(\)]//g; # get rid of pesky () groups
  56.  
  57.  foreach $BI (@BUILDITEMS)
  58.   {
  59.    my $have_match=0;
  60.    foreach $V (sort keys %VERSIONS)
  61.     {
  62.      if ($V eq "") { next; }
  63.      if ($BI =~ /^$V/i)  # software name matched
  64.       {
  65.        $have_match=1;
  66.        foreach $k (keys %{ $VERSIONS{$V} }) { if ($k eq "") { next; } $v=$k; }
  67.        if (vereval($v,$BI,$V))  # version check
  68.         { 
  69.          my $msg = $VERSIONS{$V}{$v};
  70.          $msg =~ s/\@RUNNING_VER/$BI/g;
  71.          $msg =~ s/\@CURRENT_VER/$v/g;
  72.          chomp($msg);
  73.          nprint("+ $msg");
  74.         }
  75.       }
  76.     }
  77.   if (!$have_match) { $UPDATES{$BI}=1;}
  78.   }
  79.   
  80.  return;
  81. }
  82.  
  83. sub load_versions
  84. {
  85.  my @T=();
  86.  my %VERS;
  87.  my $F=$_[0] || return;
  88.  open(VF,"<$F") || die nprint("Cannot open versions file '$F': $!");
  89.  my @V=<VF>;
  90.  close(VF);
  91.  foreach my $line (@V)
  92.  {
  93.   chomp($line);
  94.   if ($line =~ /^\#/) { next; }
  95.   if ($line eq "") { next; }
  96.   if ($line =~ /\#/) { $line=~s/\#.*$//; $line=~s/\s+$//; }
  97.   my @T=parse_csv($line); 
  98.   #    Match   Vers   Message
  99.   $VERS{$T[0]}{$T[1]}=$T[2];
  100.  }
  101. return %VERS;
  102. }
  103.  
  104. sub vereval
  105. {
  106.  # split both by last char of @_[0], as it is the name to version separator
  107.  my $sepr=substr($_[2],(length($sepr)-1),1);
  108.  nprint("nikto_outdated.plugin: verstring: $_[2], sepr:$sepr","d");
  109.  
  110.  $CURRENT=lc($_[0]);
  111.  $RUNNING=lc($_[1]);
  112.  
  113.  nprint("nikto_outdated.plugin: \$CURRENT:$CURRENT:\$RUNNING:$RUNNING:","d");
  114.  
  115.  my @T=split(/$sepr/,$CURRENT);
  116.  my $CURRENT=$T[$#T]; # should be version...
  117.  @T=split(/$sepr/,$RUNNING);
  118.  my $RUNNING=$T[$#T]; # should be version...
  119.  
  120. # convert alphas to numerics so we can do a real comparison
  121.  $CURRENT=~ s/([^0-9\.]){1}/"." . ord($1) . "."/eg;
  122.  $RUNNING=~ s/([^0-9\.]){1}/"." . ord($1) . "."/eg;
  123.  $RUNNING =~ s/\.+/\./g;
  124.  $CURRENT =~ s/\.+/\./g;
  125.  $RUNNING =~ s/^\.//;
  126.  $CURRENT =~ s/^\.//;
  127.  $RUNNING =~ s/\.$//;
  128.  $CURRENT =~ s/\.$//;
  129.  
  130.  nprint("nikto_outdated.plugin: \$CURRENT:$CURRENT:\$RUNNING:$RUNNING\: (after numberifcation)","d");
  131.  
  132.  if (($CUR_ORIG !~ /[a-zA-Z]/) && ($RUN_ORIG !~ /[a-zA-Z]/)) 
  133.  {
  134.   @CUR=split(/\./,$CURRENT);
  135.   @RUN=split(/\./,$RUNNING);
  136.  }
  137.  else 
  138.  {
  139.   @CUR=split(//,$CURRENT);
  140.   @RUN=split(//,$RUNNING);
  141.  }
  142.  
  143. # start with 0... eval each in turn...
  144.  for (my $i=0;$i<=$#CUR;$i++)
  145.   {
  146.    nprint("nikto_outdated.plugin: major compare: \$CUR[$i]:$CUR[$i]: \$RUN[$i]:$RUN[$i]:","d");
  147.    if ($CUR[$i] > $RUN[$i])                  { return 1; } # running is older
  148.    if (($CUR[$i] ne "") && ($RUN[$i] eq "")) { return 1; } # running is older
  149.    if ($CUR[$i] < $RUN[$i])                                # running is newer
  150.      { 
  151.       my $string = $_[1];
  152.       $string =~ s/\s/\%20/g;
  153.       $UPDATES{$string}=1;
  154.       return 0; 
  155.      }
  156.   }
  157.  
  158.  return 0;  # running is the same version if we make it here
  159. }
  160.  
  161. 1;
  162.